/*
题目描述
在河上有一座独木桥，一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子，青蛙很讨厌踩在这些石子上。
由于桥的长度和青蛙一次跳过的距离都是正整数，我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点：0,1,⋯,L（其中 L 是桥的长度）。
坐标为 0 的点表示桥的起点，坐标为 L 的点表示桥的终点。青蛙从桥的起点开始，不停的向终点方向跳跃。
一次跳跃的距离是 S 到 T 之间的任意正整数（包括 S,T）。当青蛙跳到或跳过坐标为 L 的点时，就算青蛙已经跳出了独木桥。
题目给出独木桥的长度 L，青蛙跳跃的距离范围 S,T，桥上石子的位置。你的任务是确定青蛙要想过河，最少需要踩到的石子数。
输入格式
输入共三行，
第一行有 1 个正整数 L，表示独木桥的长度。
第二行有 3 个正整数 S,T,M，分别表示青蛙一次跳跃的最小距离，最大距离及桥上石子的个数。
第三行有 M 个不同的正整数分别表示这 M 个石子在数轴上的位置（数据保证桥的起点和终点处没有石子）。所有相邻的整数之间用一个空格隔开。
输出格式
一个整数，表示青蛙过河最少需要踩到的石子数。
*/
//!!!路径压缩最重要的点是 如果每次都能选择走t或t+1步又因为gcd(t,t+1)==1 由邮票定理可得最大不可组合之数为g(t,t+1)=t*(t+1)-t-t-1=t^2-t-1 所以大于等于t*(t-1)的数都是可达的

//邮票定理假如又两个互质的正整数 a,b 那么这两个正数的最大不可组合数为 g(a,b)=a*b-a-b

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;

unordered_map<int,bool> flag;


int main(){
	int l;
	int s,t,m;
	cin>>l;
	cin>>s>>t>>m;
	vector<int> a(m);
	for(int i=0;i<m;i++){
		cin>>a[i];
	}
	
	if(s==t){
		int cnt=0;
		for(int i=0;i<a.size();i++){
			if(a[i]%s==0){
				cnt++;
			}
		}
		
		cout<<cnt<<endl;
		return 0;
	}
	
	sort(a.begin(),a.end());
	int maxsize=0;
	
	for(int i=0;i<m;i++){
		int size;
		if(i){
			size=a[i]-a[i-1];
			maxsize+=min(90,size);
			flag[maxsize]=true;
		}else{
			size=a[0]-0;
			maxsize+=min(90,size);
			flag[maxsize]=true;
		}
	}
	maxsize+=min(l-a[m-1],90);
	vector<int> f(maxsize+1,INF);
	f[0]=0;
	for(int i=1;i<=maxsize;i++){
		for(int j=s;j<=t;j++){
			if(i>=j){
				f[i]=min(f[i],f[i-j]+flag[i]);
			}
		}
	}
	int ans=INF;
	for(int i=1;i<=t;i++){
		if(maxsize>=i){
			ans=min(ans,f[maxsize-i]);
		}
	}
	
	cout<<ans<<endl;
	return 0;
}